/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.dao.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import pe.com.cotelasa.common.dao.DaoImpl;
import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAOProveedorArticulo;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.entidad.ProveedorArticulo;

/**
 *
 * @author usuario
 */
@Repository("daoProveedorArticulo")
@SuppressWarnings("unchecked")
public class DAOProveedorArticuloImpl extends DaoImpl<ProveedorArticulo, Integer> implements IDAOProveedorArticulo, Serializable {

    @Autowired
    private SessionFactory sessionFactory;

    @Transactional
    public Collection<ProveedorArticulo> listarArticulosPorProveedor(ProveedorArticulo proveedorArticulo) throws DAOException {
        List<ProveedorArticulo> listaArticulosPorProveedor = new ArrayList<ProveedorArticulo>();
        try {
            sessionFactory.getCurrentSession().flush();
            listaArticulosPorProveedor = sessionFactory.getCurrentSession().createCriteria(ProveedorArticulo.class)
                    .createAlias("articulo", "ar")
                    .add(Restrictions.like("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("proveedor", proveedorArticulo.getProveedor()))
                    .add(Restrictions.disjunction()
                        .add(Restrictions.eq("ar.idCategoriaArticulo", proveedorArticulo.getArticulo().getIdCategoriaArticulo()))
                    ).list();

        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }

        return listaArticulosPorProveedor;
    }
    
    @Transactional
    public ProveedorArticulo obtenerProveedorArticuloPorId(ProveedorArticulo proveedorArticulo) throws DAOException{
        ProveedorArticulo provAr = null;
        try {
            sessionFactory.getCurrentSession().flush();
            provAr = (ProveedorArticulo) sessionFactory.getCurrentSession().createCriteria(ProveedorArticulo.class)
                    .add(Restrictions.like("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("proveedor", proveedorArticulo.getProveedor()))
                    .add(Restrictions.eq("articulo", proveedorArticulo.getArticulo()))
                    .uniqueResult();
            
            return provAr; 

        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }

    }
    
    @Transactional
    public Collection<ProveedorArticulo> listarPorProveedor(ProveedorArticulo proveedorArticulo) throws DAOException{
        Collection<ProveedorArticulo> lista = null;
        try {
            sessionFactory.getCurrentSession().flush();
            lista = sessionFactory.getCurrentSession().createCriteria(ProveedorArticulo.class)
                    .add(Restrictions.like("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("proveedor", proveedorArticulo.getProveedor()))
                    .list();
            
            return lista; 

        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }

    }
    
    @Transactional
    public Collection<Object> listarProveedoresDistintos() throws DAOException{
        Collection<Object> lista = null;
        try {
            sessionFactory.getCurrentSession().flush();
            lista = sessionFactory.getCurrentSession().createCriteria(ProveedorArticulo.class)
                    .createAlias("proveedor", "pro")
                    .add(Restrictions.like("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.like("pro.estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .setProjection(Projections.distinct(Projections.property("proveedor")))
                    .list();
            System.out.println("lista de proveedores: "+lista);
            return lista; 

        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }

    }
}
